<?php
/*

  Фабрика, которая делает классы, реализующие "хранилище профилей принципалов"

  PrincipalStorage( &$principal )
      - $principal       -- к какому принципалу прикрепляться

  -------------------

  // Фабрика (статический метод)

  * &Factory( &$principal, $model_name ) -- вернуть экземпляр класса PrincipalStorage_<model_name>
      - $principal  -- к какому принципалу прикрепляться
      - $model_name -- название модели "хранилища"

  // Политика наследников (конкретных моделей), использование модели:

  * LoadById( $id ) -- загрузить по цифровому идентификатору (использующемуся как FKEY как правило)
      - $id -- число-идентификатор
  * LoadByLogin( $login, $realm="" ) -- загрузить учётную запись по логину
      - $login -- тот самый логин
      - $realm -- необязательный параметр, позволяющий делить всех пользователей по, например, "узлам"

  * SetStoredPassword( $user_data, $new_invariant ) -- изменить в БД сохранённый инвариант
      - $user_data      -- профиль принципала (по нему модель определяет, где ей менять, например, используя "user_id"
      - $new_invariant  -- новое значение поля "stored_invariant"
      - true, if success

  * SetLoginDatetime( $user_data, $datetime="" ) -- изменить в БД дату последнего логина
      - $user_data      -- профиль принципала (по нему модель определяет, где ей менять, например, используя "user_id"
      - $datetime       -- на какую дату-время изменить? если пустое, то берёт текущую. 
                           в формате time()

  NB: оба метода возвращают структуру для размещения в $principal->data,
      либо false -- если загрузка не удалась.

================================================================== v.1 (kuso@npj)
*/

abstract class RL_Principal_Storage
{
  
	/**
	 * Объект принципала
	 *
	 * @var RL_Principal
	 */
	public $principal;
	
	/**
	 * ССылка на RH
	 *
	 * @var RL_SiteRequestHandler
	 */
	public $rh;
	
	/**
	 * Конструктор
	 *
	 * @final 
	 * @param RL_Principal $principal
	 */
	public function __construct( RL_Principal $principal )
  {
    $this->principal = $principal;
    $this->rh = $principal->rh;
  }

  abstract public function loadById($id);
  
  abstract public function loadByLogin($login, $realm = "");

  abstract public function setStoredPassword( $user_data, $new_invariant );

  public function setLoginDatetime( $user_data, $datetime="" )
  {
  	if ($datetime == "") {
  		$datetime = time();
  	}
  	return $this->_setLoginDatetime( $user_data, $datetime );
  }
   
  abstract protected function _setLoginDatetime( $user_data, $datetime );
   
  /**
   * Фабрика, которая делает классы, реализующие "хранилище профилей принципалов"
   *
   * @static 
   * @param RL_Principal $principal
   * @param string $model_name
   * @return RL_PrincipalStorage
   */
  static public function Factory( RL_Principal $principal, $model_name )
  {
  	$class_name = "RL_Principal_Storage_".$model_name;
  	// find script or die
  	$principal->rh->useClass($class_name);

  	$product = new $class_name( $principal );
  	return $product;
  }

// EOC{ PrincipalStorage }
}


?>
